package com.dragon.modules.yuegou.client.wechat_mini.client;

import com.dragon.modules.yuegou.client.wechat_mini.response.Code2SessionResponse;
import com.dragon.modules.yuegou.client.wechat_mini.response.TokenResponse;
import com.dragon.modules.yuegou.client.wechat_mini.response.UnionIdResponse;

/**
 * 认证接口
 * 
 * @author liuwu
 *
 */
public interface AuthClient {

	/**
	 * 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
	 * 
	 * @param appid     小程序 appId
	 * @param secret    小程序 appSecret
	 * @param jsCode    登录时获取的 code
	 * @param grantType 授权类型，此处只需填写 authorization_code
	 * @return 用户标识（openid、sessionKey、unionId）
	 */
	Code2SessionResponse code2Session(String appid, String secret, String jsCode, String grantType);

	/**
	 * 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
	 * 
	 * @param appid  小程序 appId
	 * @param secret 小程序 appSecret
	 * @param jsCode 登录时获取的 code
	 * @return 用户标识（openid、sessionKey、unionId）
	 */
	default Code2SessionResponse code2Session(String appid, String secret, String jsCode) {
		return code2Session(appid, secret, jsCode, "authorization_code");
	}

	/**
	 * 用户支付完成后，获取该用户的 UnionId，无需用户授权。本接口支持第三方平台代理查询。<br>
	 * 注意：调用前需要用户完成支付，且在支付后的五分钟内有效。
	 * 
	 * 
	 * @param accessToken   接口调用凭证
	 * @param openid        支付用户唯一标识
	 * @param transactionId 微信支付订单号
	 * @return unionid
	 */
	UnionIdResponse getPaidUnionId(String accessToken, String openid, String transactionId);

	/**
	 * 用户支付完成后，获取该用户的 UnionId，无需用户授权。本接口支持第三方平台代理查询。<br>
	 * 注意：调用前需要用户完成支付，且在支付后的五分钟内有效。
	 * 
	 * @param accessToken 接口调用凭证
	 * @param openid      支付用户唯一标识
	 * @param outTradeNo  微信支付商户订单号
	 * @param mchId       微信支付分配的商户号
	 * @return unionid
	 */
	UnionIdResponse getPaidUnionId(String accessToken, String openid, String outTradeNo, String mchId);

	/**
	 * 获取小程序全局唯一后台接口调用凭据（access_token）。调用绝大多数后台接口时都需使用 access_token，开发者需要进行妥善保存。
	 * 
	 * @param appid     小程序唯一凭证，即 AppID，可在「微信公众平台 - 设置 -
	 *                  开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）
	 * @param secret    小程序唯一凭证密钥，即 AppSecret，获取方式同 appid
	 * @param grantType 授权类型，此处只需填写 client_credential
	 * @return
	 */
	TokenResponse getAccessToken(String appid, String secret, String grantType);

	/**
	 * 获取小程序全局唯一后台接口调用凭据（access_token）。调用绝大多数后台接口时都需使用 access_token，开发者需要进行妥善保存。
	 * 
	 * @param appid  小程序唯一凭证，即 AppID，可在「微信公众平台 - 设置 -
	 *               开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）
	 * @param secret 小程序唯一凭证密钥，即 AppSecret，获取方式同 appid
	 * @return
	 */
	default TokenResponse getAccessToken(String appid, String secret) {
		return getAccessToken(appid, secret, "client_credential");
	}
}
